package com.obelisco.vista.seguridad;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Vector;

import nextapp.echo2.app.Color;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.FillImage;
import nextapp.echo2.app.LayoutDirection;
import nextapp.echo2.app.ResourceImageReference;
import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.event.ActionListener;

import com.obelisco.modelo.data.CarpetaTransaccion;
import com.obelisco.modelo.data.Transaccion;
import com.obelisco.modelo.data.Usuario;

import echopointng.MenuBar;
import echopointng.MenuItem;

public class MenuBarSeguridad extends MenuBar {

	private Usuario usuario;
	private CarpetaTransaccion raiz;
	private HashMap invokerMap;
	private boolean orientacionHorizontal = true;
	private Vector<EjecutarListener> listeners = new Vector<EjecutarListener>();
	
	public MenuBarSeguridad() {
		super();
		this.setBackground(new Color(250, 207, 118));		
	}

	public void distribuirEventoTransaccion(Transaccion t) {
		for (Iterator i = listeners.iterator(); i.hasNext();) {
			EjecutarListener l = (EjecutarListener) i.next();
			l.onClickTransaccion(t);
		}
	}
	
	public void distribuirEventoCarpeta(CarpetaTransaccion c) {
		for (Iterator i = listeners.iterator(); i.hasNext();) {
			EjecutarListener l = (EjecutarListener) i.next();
			l.onClickCarpeta(c);
		}
	}
	
	private ActionListener actionListener = new ActionListener(){

		public void actionPerformed(ActionEvent arg0) {
			// TODO Auto-generated method stub
			String actionComand = arg0.getActionCommand();
			Object objeto = invokerMap.get(actionComand);
			if (objeto instanceof CarpetaTransaccion) {
				distribuirEventoCarpeta((CarpetaTransaccion)objeto);
			}
			else if (objeto instanceof Transaccion) {
				distribuirEventoTransaccion((Transaccion)objeto);
			}
		}		
	};
	
	private void crearMenues(MenuSeguridad padre, CarpetaTransaccion carpeta) {
		MenuSeguridad hijo = new MenuSeguridad(carpeta);		
		hijo.setActionCommand("C"+carpeta.getCodigo());
		invokerMap.put(hijo.getActionCommand(), carpeta);
		if (padre == null) {			
			if (!orientacionHorizontal) {
				hijo.setText("Menu");
				this.add(hijo);
			}
		} else {
			if ((padre.getCarpeta().equals(this.raiz)) && (this.orientacionHorizontal)) {
				this.add(hijo);
			}
			else {
				padre.add(hijo);
			}
		}
		for (Iterator i = carpeta.getHijos().iterator(); i.hasNext();) {
			CarpetaTransaccion carpetaHija = (CarpetaTransaccion) i.next();			
			crearMenues(hijo, carpetaHija);			
		}
		// Adicionamos las transacciones
		for (Iterator i = carpeta.getTransacciones().iterator(); i.hasNext();) {
			Transaccion transaccion = (Transaccion) i.next();
			MenuItemSeguridad menuItemSeguridad = new MenuItemSeguridad(transaccion);
			menuItemSeguridad.setActionCommand("T"+transaccion.getCodigo());
			invokerMap.put(menuItemSeguridad.getActionCommand(), transaccion);
			menuItemSeguridad.addActionListener(this.actionListener);
			hijo.add(menuItemSeguridad);
		}
	}
	
	private void setRaiz(CarpetaTransaccion raiz) {
		this.raiz = raiz;
		this.removeAll();
		if (this.raiz != null) {
			this.invokerMap = new HashMap();
			this.crearMenues(null, raiz);
		}		
	}
		
	public CarpetaTransaccion getRaiz() {
		return raiz;
	}
	
	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
		this.setRaiz(this.usuario.getFunciones());
	}

	public boolean isOrientacionHorizontal() {
		return orientacionHorizontal;
	}

	public void setOrientacionHorizontal(boolean orientacionHorizontal) {
		this.orientacionHorizontal = orientacionHorizontal;
	}

	public void addBarraMenuUsuarioListener(EjecutarListener listener) {
		listeners.add(listener);
	}

	public void removeBarraMenuUsuarioListener(EjecutarListener listener) {
		listeners.remove(listener);
	}

}
